package main

import (
	"fmt"
	"math/rand"
	"strconv"
	"strings"
	"time"
)

//创建一个初始长度为0、容量为10的int型切片，调用rand.Intn(128)100次，往切片里面添加100个元素，利用map统计该切片里有多少个互不相同的元素。
func zuoye1() {

	a := make([]int, 0, 10) //1、创建一个初始长度为0、容量为10的int型切片
	fmt.Println("切片100个元素")
	for i := 0; i < 100; i++ { //2、调用rand.Intn(128)100次，往切片里面添加100个元素
		rand.Seed(time.Now().UnixNano())
		a = append(a, rand.Intn(128))
		time.Sleep(time.Millisecond * 10)
		fmt.Printf("%d ", a[i])
	}

	//初始化map
	m := make(map[int]int, 100)

	//将切片赋值到map
	for _, v := range a {
		m[v] = v
	}

	//3、利于map统计该切片里有多少个互不相同的元素
	fmt.Printf("\n\nmap不相同的元素\n")
	for _, v := range m {
		fmt.Printf("%d ", v)
	}
	fmt.Printf("\n该切片合计有%d个不同元素", len(m))

}

/*实现一个函数func arr2string(arr []int) string，比如输入[]int{2,4,6}，返回“2 4 6”。输入的切片可能很短，也可能很长。
  1、传入的是切片长度是0
  2、传入的切片是nil，返回"" 空字符串
  3、传入的切片1个元素，后面不带空格  2 返回“2”
  4、传入的切片[]int{2,4,6}，返回“2 4 6”
*/
func arr2string(arr []int) string {
	if len(arr) == 0 {
		return "切片长度0"
	}

	if arr == nil {
		return ""
	}

	if len(arr) == 1 {
		return strconv.Itoa(arr[0])
	}

	sb := strings.Builder{}
	for k, v := range arr {
		s := strconv.Itoa(v)
		sb.WriteString(s)
		if k == (len(arr) - 1) {
			continue
		}
		sb.WriteString(" ")
	}

	return sb.String()
}

func main() {
	zuoye1()

	//切片长度0
	arra := make([]int, 0)

	//切片是nil
	//var arrb []int

	//切片是1个元素
	arrc := []int{1}

	//切片2 4 6
	arrd := []int{2, 4, 6}

	fmt.Printf("\n\n-----------------------------------------------------------------\n")

	fmt.Printf("%s\n", arr2string(arra))
	fmt.Printf("%s\n", arr2string(nil))
	fmt.Printf("%s\n", arr2string(arrc))
	fmt.Printf("%s\n", arr2string(arrd))
}
